﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using RzCorportativo.DataAccess;

namespace RzCorportativo.Lib
{
    public class Formacao
    {
        public Formacao()
        {
            this.Instituicao = string.Empty;
        }

        private bool concluido;
        private bool concluidoChanged;

        public long FormacaoId { get; set; }

        public int CursoId { get; set; }

        public string Instituicao { get; set; }

        public int AnoInicio { get; set; }

        public int AnoFim { get; set; }

        public int EnderecoId { get; set; }

        public Endereco Endereco { get; set; }

        public long UsuarioId { get; set; }

        public Usuario Usuario { get; set; }

        public Curso Curso { get; set; }

        public bool Concluido { get { return this.concluido; } set { this.concluido = value; this.concluidoChanged = true; } }

        public bool IsNew { get { return this.FormacaoId == 0; } }

        public bool Salvar()
        {
            var retorno = false;
            DataAccess.Formacao model = null;
            Transaction.Begin(context =>
            {
                if (this.Endereco != null)
                {
                    this.Endereco.Salvar();
                    if (this.Endereco.EnderecoId == 0)
                        throw new Exception("Falha ao salvar endereço da formação");
                    this.EnderecoId = this.Endereco.EnderecoId;
                }
                    
                if (this.IsNew)
                    model = this.Insert(context);
                else
                    model = this.Update(context);
                retorno = true;
                return true;
            }).OnError(exception =>
            {
                throw exception;
            }).OnSuccess(() =>
            {
                this.FormacaoId = model.FormacaoId;
            });
            return retorno;
        }

        private DataAccess.Formacao Insert(DataAccess.SistemaCurricularEntities context)
        {
            var item = this.CreateModel(context);
            context.AddToFormacao(item);
            return item;
        }

        private DataAccess.Formacao Update(DataAccess.SistemaCurricularEntities context)
        {
            var item = this.CreateModel(context);
            return item;
        }

        private DataAccess.Formacao CreateModel(DataAccess.SistemaCurricularEntities context)
        {
            DataAccess.Formacao item = null;
            if (this.IsNew)
                item = new DataAccess.Formacao();
            else
            {
                item = context.Formacao.FirstOrDefault(f => f.FormacaoId == this.FormacaoId);
                if (item == null)
                    throw new Exception("Còdigo de formação inválido");
            }
            item.FormacaoId = this.FormacaoId;
            item.AnoFim = this.AnoFim;
            item.AnoInicio = this.AnoInicio;
            item.UsuarioId = this.UsuarioId;
            item.Instituicao = this.Instituicao;
            item.Concluido = this.AnoFim > 0;
            item.CursoId = this.CursoId;
            item.EnderecoId = this.EnderecoId;
            return item;
        }

        public static List<Lib.Formacao> Listar(Formacao item)
        {
            if (item == null)
                item = new Formacao();
            var context = new DataAccess.SistemaCurricularEntities();
            var lista = context.Formacao.Where(a => a.Instituicao.StartsWith(item.Instituicao) &&
                (item.CursoId == 0 || item.CursoId == a.CursoId) &&
                (item.UsuarioId == 0 || item.UsuarioId == a.UsuarioId) &&
                (item.AnoInicio == 0 || item.AnoInicio == a.AnoInicio) &&
                (!item.concluidoChanged || item.concluido == a.Concluido)
                ).ToList().Select(s => item.Create(s)).ToList();
            return lista;
        }

        private Lib.Formacao Create(DataAccess.Formacao model)
        {
            if (model == null)
                return null;
            Lib.Formacao item = new Formacao();
            item.FormacaoId = model.FormacaoId;
            item.AnoFim = model.AnoFim;
            item.AnoInicio = model.AnoInicio;
            item.Endereco = new Endereco().CreateEndereco(model.Endereco);
            item.UsuarioId = model.UsuarioId;
            item.Usuario = new Usuario().Create(model.Usuario);
            item.Instituicao = model.Instituicao;
            item.Concluido = model.Concluido;
            item.CursoId = model.CursoId;
            item.Curso = new Curso().Create(model.Curso);
            return item;
        }

        public bool Excluir()
        {
            bool retorno = false;
            Transaction.Begin((context) =>
            {
                context.Formacao.DeleteObject(this.CreateModel(context));
                retorno = true;
                return true;
            }).OnError(exception =>
            {
                throw exception;
            }).OnSuccess(() =>
            {

            });
            return retorno;
        }
    }
}
